/****************************************************
 * 创建人：  tanglei  
 * 创建时间: 2022/9/1/14:20
 * 项目名称：junit_test
 * 文件名称: TreeUtil.java
 * 文件描述: @Description: 
 *
 * All rights Reserved, Designed By 投资交易团队
 * @Copyright:2016-2022
 *
 ********************************************************/
package com.springboot.util;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * 包名称：  src.util
 * 类名称：TreeUtil
 * 类描述：
 * 创建人：  tanglei
 * 创建时间：2022/9/1 14:20
 */
public class TreeUtil {


    /**
     *
     * @Title: toTree
     * @Description: List转为树结构
     * @param collection 数据集合
     * @param key 唯一key
     * @param parentKey 父key
     * @param treeClazz 转换后的树类型
     * @param childrenKey 子节点列表key
     * @return
     * @return: List<T>
     * @throws
     * @author: hechengcheng
     * @Date:  2020年2月24日/下午8:56:02
     */
    public static <T> List<T> toTree(Collection<?> collection, String key, String parentKey, Class<T> treeClazz, String childrenKey) {

        Map<Object, JSONObject> treeMap = new HashMap<Object, JSONObject>(16);

        // List转为Map
        for (Object object : collection) {

            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(object));

            Object keyValue = jsonObject.get(key);

            treeMap.put(keyValue, jsonObject);
        }

        // 返回树
        List<JSONObject> treeList = new ArrayList<JSONObject>();

        // 遍历Map, 合并成Map树
        for(Map.Entry<Object, JSONObject> entity : treeMap.entrySet()) {
            //对象
            JSONObject entityValue = entity.getValue();
            //父节点
            Object parentKeyValue = entityValue.get(parentKey);

            // 判断是否根节点, 如果为根节点则添加到Map树
            if (ObjectUtil.isEmpty(treeMap.get(parentKeyValue))) {
                treeList.add(entityValue);
                continue;
            }

            // 如果是子节点, 则添加到根节点
            JSONObject jsonObject = treeMap.get(parentKeyValue);

            if (ObjectUtil.isNotEmpty(jsonObject)) {
                JSONArray jsonArray = jsonObject.getJSONArray(childrenKey);

                if (ObjectUtil.isEmpty(jsonArray)) {
                    jsonArray = new JSONArray();
                    jsonObject.put(childrenKey, jsonArray);
                }

                jsonArray.add(entityValue);
            }
        }

        // 转为实体对象
        return JSON.parseArray(JSON.toJSONString(treeList), treeClazz);
    }


}

